home *** CD-ROM | disk | FTP | other *** search
/ Delphi Magazine Collection 2001 / Delphi Magazine Collection 20001 (2001).iso / DISKS / ISSUE01 / CONSTRUC / CONVERT.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1994-12-30  |  9.5 KB  |  261 lines

  1. unit Convert;
  2. interface
  3. uses SysUtils, Classes;
  4.  
  5. Type
  6.   TConvert = class(TComponent)
  7.                private
  8.                  FValue: Word;
  9.  
  10.                protected
  11.                  function GetHex: String;
  12.                  function GetRoman: String;
  13.  
  14.                  procedure SetHex(Const Value: String);
  15.                  procedure SetRoman(Const Rom: String);
  16.  
  17.                published
  18.                  property Decimal: Word read FValue write FValue;
  19.                  property Hex:   String read GetHex write SetHex;
  20.                  property Roman: String read GetRoman write SetRoman;
  21.  
  22.                public
  23.                  constructor Create(AOwner: TComponent); override;
  24.              end {TConvert};
  25.  
  26.   procedure Register;
  27.  
  28. implementation
  29.  
  30.   constructor TConvert.Create(AOwner: TComponent);
  31.   begin
  32.     inherited Create(AOwner);
  33.     FValue := 0;
  34.   end {Create};
  35.  
  36.   function TConvert.GetHex: String;
  37.   Const Digits: Array[0..$F] of Char = '0123456789ABCDEF';
  38.   begin
  39.     GetHex[0] := #4;
  40.     GetHex[1] := Digits[Hi(FValue) SHR 4];
  41.     GetHex[2] := Digits[Hi(FValue) AND $F];
  42.     GetHex[3] := Digits[Lo(FValue) SHR 4];
  43.     GetHex[4] := Digits[Lo(FValue) AND $F];
  44.   end {GetHex};
  45.  
  46.   procedure TConvert.SetHex(Const Value: String);
  47.   var code: Integer;
  48.   begin
  49.     if (Value[1] <> '$') then Val('$'+Value,FValue,code)
  50.                          else Val(Value,FValue,code)
  51.   end {SetHex};
  52.  
  53.  
  54.   function TConvert.GetRoman: String; Assembler;
  55.   ASM
  56.         les   DI,@Result
  57.         inc   DI
  58.         push  DS
  59.         lds   SI,self
  60.         add   SI,FValue
  61.         lodsw
  62.         pop   DS
  63.         mov   BX,AX        { BS := FValue;          }
  64.         xor   AX,AX        { len := 0;              }
  65.  
  66.   @1000:cmp   BX,1000      { if W < 1000 then       }
  67.         jb    @900         {   goto @900            }
  68.                            { else begin             }
  69.         sub   BX,1000      {   W := W - 1000;       }
  70.         inc   AH           {   len := len + 1;      }
  71.         mov   AL,'M'
  72.         stosb              {   Int2Rom[len] := 'M'; }
  73.                            { end;                   }
  74.         jmp   @1000        { goto @1000;            }
  75.  
  76.   @900: cmp   BX,900       { if W < 900 then        }
  77.         jb    @500         {   goto @500            }
  78.                            { else begin             }
  79.         sub   BX,900       {   W := W - 900;        }
  80.         inc   AH           {   len := len + 1;      }
  81.         mov   AL,'C'
  82.         stosb              {   Int2Rom[len] := 'C'; }
  83.         inc   AH           {   len := len + 1;      }
  84.         mov   AL,'M'
  85.         stosb              {   Int2Rom[len] := 'M'; }
  86.                            { end;                   }
  87.         jmp   @90          { goto @90;              }
  88.  
  89.   @400: cmp   BX,400       { if W < 400 then        }
  90.         jb    @100         {   goto @100            }
  91.                            { else begin             }
  92.         sub   BX,400       {   W := W - 400;        }
  93.         inc   AH           {   len := len + 1;      }
  94.         mov   AL,'C'
  95.         stosb              {   Int2Rom[len] := 'C'; }
  96.         inc   AH           {   len := len + 1;      }
  97.         mov   AL,'D'
  98.         stosb              {   Int2Rom[len] := 'D'; }
  99.                            { end;                   }
  100.         jmp   @90          { goto @90;              }
  101.  
  102.   @500: cmp   BX,500       { if W < 500 then        }
  103.         jb    @400         {   goto @400            }
  104.                            { else begin             }
  105.         sub   BX,500       {   W := W - 500;        }
  106.         inc   AH           {   len := len + 1;      }
  107.         mov   AL,'D'
  108.         stosb              {   Int2Rom[len] := 'D'; }
  109.                            { end;                   }
  110.       { jmp   @100           goto @100;             }
  111.  
  112.   @100: cmp   BX,100       { if W < 100 then        }
  113.         jb    @90          {   goto @90             }
  114.                            { else begin             }
  115.         sub   BX,100       {   W := W - 100;        }
  116.         inc   AH           {   len := len + 1;      }
  117.         mov   AL,'C'
  118.         stosb              {   Int2Rom[len] := 'C'; }
  119.                            { end;                   }
  120.         jmp   @100         { goto @100;             }
  121.  
  122.    @90: cmp   BX,90        { if W < 90 then         }
  123.         jb    @50          {   goto @50             }
  124.                            { else begin             }
  125.         sub   BX,90        {   W := W - 90;         }
  126.         inc   AH           {   len := len + 1;      }
  127.         mov   AL,'X'
  128.         stosb              {   Int2Rom[len] := 'X'; }
  129.         inc   AH           {   len := len + 1;      }
  130.         mov   AL,'C'
  131.         stosb              {   Int2Rom[len] := 'C'; }
  132.                            { end;                   }
  133.         jmp   @9           { goto @9;               }
  134.  
  135.    @40: cmp   BX,40        { if W < 40 then         }
  136.         jb    @10          {   goto @10             }
  137.                            { else begin             }
  138.         sub   BX,40        {   W := W - 40;         }
  139.         inc   AH           {   len := len + 1;      }
  140.         mov   AL,'X'
  141.         stosb              {   Int2Rom[len] := 'X'; }
  142.         inc   AH           {   len := len + 1;      }
  143.         mov   AL,'L'
  144.         stosb              {   Int2Rom[len] := 'L'; }
  145.                            { end;                   }
  146.         jmp   @9           { goto @9;               }
  147.  
  148.    @50: cmp   BX,50        { if W < 50 then         }
  149.         jb    @40          {   goto @40             }
  150.                            { else begin             }
  151.         sub   BX,50        {   W := W - 50;         }
  152.         inc   AH           {   len := len + 1;      }
  153.         mov   AL,'L'
  154.         stosb              {   Int2Rom[len] := 'L'; }
  155.                            { end;                   }
  156.       { jmp   @10            goto @10;              }
  157.  
  158.    @10: cmp   BX,10        { if W < 10 then         }
  159.         jb    @9           {   goto @9              }
  160.                            { else begin             }
  161.         sub   BX,10        {   W := W - 10;         }
  162.         inc   AH           {   len := len + 1;      }
  163.         mov   AL,'X'
  164.         stosb              {   Int2Rom[len] := 'X'; }
  165.                            { end;                   }
  166.         jmp   @10          { goto @10;              }
  167.  
  168.     @9: cmp   BX,9         { if W < 9 then          }
  169.         jb    @5           {   goto @5              }
  170.                            { else begin             }
  171.         sub   BX,9         {   W := W - 9;          }
  172.         inc   AH           {   len := len + 1;      }
  173.         mov   AL,'I'
  174.         stosb              {   Int2Rom[len] := 'I'; }
  175.         inc   AH           {   len := len + 1;      }
  176.         mov   AL,'X'
  177.         stosb              {   Int2Rom[len] := 'X'; }
  178.                            { end;                   }
  179.         jmp   @0           { goto @0;               }
  180.  
  181.     @4: cmp   BX,4         { if W < 4 then          }
  182.         jb    @1           {   goto @1              }
  183.                            { else begin             }
  184.         sub   BX,4         {   W := W - 4;          }
  185.         inc   AH           {   len := len + 1;      }
  186.         mov   AL,'I'
  187.         stosb              {   Int2Rom[len] := 'I'; }
  188.         inc   AH           {   len := len + 1;      }
  189.         mov   AL,'V'
  190.         stosb              {   Int2Rom[len] := 'V'; }
  191.                            { end;                   }
  192.         jmp   @0           { goto @0;               }
  193.  
  194.     @5: cmp   BX,5         { if W < 5 then          }
  195.         jb    @4           {   goto @4              }
  196.                            { else begin             }
  197.         sub   BX,5         {   W := W - 5;          }
  198.         inc   AH           {   len := len + 1;      }
  199.         mov   AL,'V'
  200.         stosb              {   Int2Rom[len] := 'V'; }
  201.                            { end;                   }
  202.       { jmp   @1             goto @1;               }
  203.  
  204.     @1: cmp   BX,1         { if W < 1 then          }
  205.         jb    @0           {   goto @0              }
  206.                            { else begin             }
  207.         dec   BX           {   W := W - 1;          }
  208.         inc   AH           {   len := len + 1;      }
  209.         mov   AL,'I'
  210.         stosb              {   Int2Rom[len] := 'I'; }
  211.                            { end;                   }
  212.         jmp   @1           { goto @1;               }
  213.  
  214.     @0: les   DI,@Result
  215.     {$IFOPT G+}
  216.         shr   AX,8
  217.     {$ELSE}
  218.         mov   CL,8
  219.         shr   AX,CL
  220.     {$ENDIF}
  221.         stosb              { Int2Rom[0] := Chr(len) }
  222.   end {GetRoman};
  223.  
  224.  
  225.   procedure TConvert.SetRoman(Const Rom: String);
  226.   const value: Array['A'..'Z'] of Word =
  227.        (0,0,100,500,0,0,0,0,1,0,0,50,1000,0,0,0,0,0,0,0,0,5,0,10,0,0);
  228.   var len: Byte absolute Rom;
  229.       index,next: Char;
  230.       teller: Integer;
  231.       tmp: Word;
  232.   begin
  233.     tmp := 0;
  234.     teller := 0;
  235.     while (teller < len) do
  236.     begin
  237.       Inc(teller);
  238.       index := UpCase(Rom[teller]); { upcase is needed to index value }
  239.       if index in ['A'..'Z'] then
  240.       begin
  241.         next := UpCase(Rom[Succ(teller)]);
  242.         if (next in ['A'..'Z']) and (value[index] < value[next]) then
  243.         begin
  244.           Inc(tmp,value[next]);
  245.           Dec(tmp,value[index]);
  246.           Inc(teller)
  247.         end
  248.         else Inc(tmp,value[index])
  249.       end
  250.     end;
  251.     FValue := tmp
  252.   end {SetRoman};
  253.  
  254.  
  255.   procedure Register;
  256.   begin
  257.     RegisterComponents('Dr.Bob', [TConvert])
  258.   end {Register};
  259. end.
  260.  
  261.